<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <script type="module">
        // const a = {
        //     a: 'a'
        // };
        // const b = {
        //     b: 'b'
        // };
        // const c = { ...a, ...b }; // {a: 'a', b: 'b'}
        // console.log({ ...c });


        // Mixin 模式的实现
        // Mixin 指的是多个对象合成一个新的对象，新对象具有各个组成成员的接口。它的最简单实现如下。

        ////////////////////////////////////////////////////////////////////////
        // Mixin 模式的实现1
        ////////////////////////////////////////////////////////////////////////
        // function mix(...mixins) {
        //     class Mix {
        //         constructor() {
        //             for (let mixin of mixins) {
        //                 copyProperties(this, new mixin()); // 拷贝实例属性
        //             }
        //         }
        //     }

        //     for (let mixin of mixins) {
        //         copyProperties(Mix, mixin); // 拷贝静态属性
        //         copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
        //     }

        //     return Mix;
        // }

        // function copyProperties(target, source) {
        //     for (let key of Reflect.ownKeys(source)) {
        //         if (key !== 'constructor'
        //             && key !== 'prototype'
        //             && key !== 'name'
        //         ) {
        //             let desc = Object.getOwnPropertyDescriptor(source, key);
        //             Object.defineProperty(target, key, desc);
        //         }
        //     }
        // }
        ////////////////////////////////////////////////////////////////////////
        // Mixin 模式的实现2
        ////////////////////////////////////////////////////////////////////////
        import { deepClone } from "./common.js"
        function mix(...mixins) {
            class Mix {
                constructor() {
                    for (let mixin of mixins) {
                        // copyProperties(this, new mixin()); // 拷贝实例属性
                        Object.assign(this, new mixin()) // 拷贝实例属性
                    }
                }
            }

            for (let mixin of mixins) {

                copyProperties(Mix, mixin); // 拷贝静态属性
                copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
                // Object.assign(Mix, mixin);  无法拷贝静态属性 不可枚举
                // Object.assign(Mix.prototype, mixin.prototype);  无法拷贝原型属性 不可枚举

            }

            return Mix;
        }

        function copyProperties(target, source) {
            for (let key of Reflect.ownKeys(source)) {
                if (key !== 'constructor'
                    && key !== 'prototype'
                    && key !== 'name'
                ) {
                     // ES2017 引入了Object.getOwnPropertyDescriptors()方法，返回指定对象所有自身属性（非继承属性）的描述对象。
                    let desc = Reflect.getOwnPropertyDescriptor(source, key);
                    Reflect.defineProperty(target, key, desc);
                }
            }
        }


        class A {
            static Astaticfun() { return "Astaticfun"; } //静态属性
            Afun() { return "Afun"; } //原型属性(函数)
            Aprop = "1"; //实例属性
        }

        class B {
            static Bstaticfun() { return "Bstaticfun"; } //静态属性
            Bfun() { return "Bfun"; } //原型属性(函数)
            Bprop = "1"; //实例属性
        }
        console.log(B.Bstaticfun());
        // console.log(B.Bfun()); ⇒出错！

        class C extends mix(A, B) { // C extends mix(A, B) ->> C 的父类就是Mix

        }


        let c = new C();
        console.log(c);




    </script>
</head>

<body>

</body>

</html>